/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;

import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class ParametroManager extends ComunManager<ParametroDto> implements Serializable {

    private static Logger logger = Logger.getLogger(ParametroManager.class);
    @Resource
    private DAOGenerico<ParametroDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    private final String url = "/pages/core/parametro/parametro.xhtml";
    private final String urlListaSistema = "/pages/core/parametro/listaParametrosSistema.xhtml";
    private final String urlListaNoSistema = "/pages/core/parametro/listaParametrosNoSistema.xhtml";
    private final Long idEntidad = 103L;
    private final Long idTodos = 6L;
    private final Long idFormaPagoAlContado = 342L;

    /**
     * Metodo para obtener todos los parametros
     *
     * @return lista de parametros
     * @throws DAOException
     */
    public List<ParametroDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(ParametroDto.class);
    }

    /**
     * Metodo para obtener un parametro por su ID
     *
     * @param id ID del parametro
     * @return Parametro
     * @throws DAOException
     */
    public ParametroDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(ParametroDto.class, id);
    }

    /**
     * Metodo para obtener parametros por filtros
     *
     * @param dtoFiltro filtros
     * @return lista de parametros
     * @throws DAOException
     */
    public List<ParametroDto> obtenerNoSistema(ParametroDto dtoFiltro) throws DAOException {
        CatalogoManager catalogoManager = (CatalogoManager) WebServletContextListener.getApplicationContext().getBean("catalogoManager");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from ParametroDto as e where e.id=e.id";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%' ";
        }
        if (dtoFiltro.getCatalogoDto() != null && dtoFiltro.getCatalogoDto().getId() != null && !dtoFiltro.getCatalogoDto().getId().equals(catalogoManager.getCatTodos())) {
            hqsql += " and e.catalogoDto = ? ";
            listaParametros.add(dtoFiltro.getCatalogoDto());
        }
        if (dtoFiltro.getParametroPadreDto() != null && dtoFiltro.getParametroPadreDto().getId() != null) {
            hqsql += " and e.parametroPadreDto = ? ";
            listaParametros.add(dtoFiltro.getParametroPadreDto());
        }

        if (dtoFiltro.getEstado() != null) {
            hqsql += " and e.estado = ?";
            listaParametros.add(dtoFiltro.getEstado());
        }
        
        hqsql += " and e.catalogoDto.tipo <> '"+ConstantesCore.ValoresDefecto.CATALOGO_TIPO_COD_SISTEMA+"' ";

        hqsql += " and e.id not in (?)";
        listaParametros.add(idTodos);

        hqsql += " order by e.catalogoDto.nombre asc, e.descripcion asc";


        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }
    
    public List<ParametroDto> obtenerSistema(ParametroDto dtoFiltro) throws DAOException {
        CatalogoManager catalogoManager = (CatalogoManager) WebServletContextListener.getApplicationContext().getBean("catalogoManager");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from ParametroDto as e where e.id=e.id";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%' ";
        }
        if (dtoFiltro.getCatalogoDto() != null && dtoFiltro.getCatalogoDto().getId() != null && !dtoFiltro.getCatalogoDto().getId().equals(catalogoManager.getCatTodos())) {
            hqsql += " and e.catalogoDto = ? ";
            listaParametros.add(dtoFiltro.getCatalogoDto());
        }
        if (dtoFiltro.getParametroPadreDto() != null && dtoFiltro.getParametroPadreDto().getId() != null) {
            hqsql += " and e.parametroPadreDto = ? ";
            listaParametros.add(dtoFiltro.getParametroPadreDto());
        }

        if (dtoFiltro.getEstado() != null) {
            hqsql += " and e.estado = ?";
            listaParametros.add(dtoFiltro.getEstado());
        }
        
        hqsql += " and e.catalogoDto.tipo = '"+ConstantesCore.ValoresDefecto.CATALOGO_TIPO_COD_SISTEMA+"' ";

        hqsql += " and e.id not in (?)";
        listaParametros.add(idTodos);

        hqsql += " order by e.catalogoDto.nombre asc, e.descripcion asc";


        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }


    /**
     * Metodo para inicializar los atributos de un catalogo
     *
     * @return Catalogo inicianilizada
     */
    public ParametroDto inicializar() {

        ParametroDto dto = new ParametroDto();
        dto.setEstado(Boolean.TRUE);
        return dto;
    }

    /**
     * Metodo para guardar
     *
     * @param dto catalogo a guardar
     * @return Cadena de satisfaccion
     */
    public String guardar(ParametroDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");


        {
            dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setTerminal(sessionMBean.getSessionTerminal());
        }
        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            try {
                dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                UtilCore.General.toUpperCaseDto(dto);
                nuevo(dto);
                sessionMBean.setAccion(applicationMBean.getEditar());
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);

                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);

                to = null;
            }
        } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            try {
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);
                to = null;
            }
        }



        return to;
    }

    public List<ParametroDto> obtenerTodosActivos(String query) throws DAOException {
        String hqsql = "select e from ParametroDto as e "
                + "where e.estado = ? "
                + " and (upper(e.descripcion) like '%" + query.toUpperCase() + "%' "
                + " or upper(e.catalogoDto.nombre) like '%" + query.toUpperCase() + "%' )"
                + " order by e.catalogoDto.nombre asc, e.descripcion";
        List<Object> listaParametros = new ArrayList<Object>();
        listaParametros.add(Boolean.TRUE);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<ParametroDto> obtenerParametrosActivosPorCatalogoSistema(Long catalogo) throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("estado", Boolean.TRUE);
        filtros.put("catalogoDto.id", catalogo);
        Map<String, String> orden = new HashMap<String, String>();
        orden.put("descripcion", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ParametroDto.class, filtros, orden);
    }
    
    public List<ParametroDto> obtenerParametrosActivosPorCatalogoSistema2(Long catalogo) throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("estado", Boolean.TRUE);
        filtros.put("catalogoDto.id", catalogo);
        Map<String, String> orden = new HashMap<String, String>();
        orden.put("id", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ParametroDto.class, filtros, orden);
    }

    public DAOGenerico<ParametroDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<ParametroDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlListaSistema() {
        return urlListaSistema;
    }

    public String getUrlListaNoSistema() {
        return urlListaNoSistema;
    }


    public Long getIdEntidad() {
        return idEntidad;
    }

    public Long getIdTodos() {
        return idTodos;
    }

    public Long getIdFormaPagoAlContado() {
        return idFormaPagoAlContado;
    }
    
}
